#ifndef _CCS_TABLE_H_
#define _CCS_TABLE_H_

/*	Date:2017/7/20 
 *	Author: Chunsheng Chen
 *	功能： 提供一个创建key-value的哈希表
 */

#include<stdio.h>
#include"util.h"

#define CM_TABSIZE 127	//哈希表的大小

// 哈希表中的一个项
struct item{
	void* key;	/* 指向key值  */
	void* value;  /* 指向value值   */
	struct item* next;	/*  采用拉链法解决哈希冲突  */
	void* prevtop; /* 指向上一个插入的项，形成一个栈 */
};

// 哈希表
struct table{
	struct item* hashtable[CM_TABSIZE]; /* CM_TABSIZE大小的哈希表  */
	void* top; /* 指向栈顶  */
};

/*
函数名：newitem
功能：生成一个新的项（item）
参数：  @1 指向key值的指针
		@2 指向value值的指针
		@3 item*指针（用于解决哈希冲突）
		@4 指向栈顶的指针
输出： 新的项（item）
注意事项：因为都是参数都是指针，需要格外注意内存的释放
*/
struct item* newitem(void*, void*, struct item*, void*);

/*
函数名： newtable
功能： 生成一个哈希表
*/
struct table* newtable();

/*
函数名：table_insert
功能：在给定的哈希表中插入key-value
参数：@1 给定的哈希表
	 @2 指向key值
	 @3 指向value值
注意事项：因为都是参数都是指针，需要格外注意内存的释放
*/
void table_insert(struct table*, void* key, void* value);

/*
函数名：table_lookup
功能：在给定的哈希表中查找对应key值得value值
参数：@1 给定的哈希表
	 @2 指向key值
返回值： 如果找到，则返回对应指向value值的指针，否则返回NULL
*/
void* table_lookup(struct table*, void* key);

/*
函数名：table_pop
功能：在给定的哈希表中弹出最后一次插入的item
参数：@1 给定的哈希表
返回值： 如果成功，则返回对应指向value值的指针，否则返回NULL
*/
void* table_pop(struct table*);

/*
函数名：table_dump
功能：在给定的哈希表中，按照指定的规则打印到输出台
参数：@1 给定的哈希表
	  @2 指定的打印规则（函数指针）
返回值： 如果成功，则返回对应指向value值的指针，否则返回NULL
*/
void table_dump(struct table*, void (*show)(void* key, void* value));




#endif
